#include <iostream>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include "log.hpp"
#include "common.hpp"
using namespace std;
const string path = "/dev/null";
void Daemon(int dir, int cle)
{
    // 1·忽略对信号/IO的反应：
    signal(SIGCHLD, SIG_IGN);//如果没有它，那么就会默认对子进程发的信号进行处理（啥也不做）；而它已经是守护进程故不能对信号相应故设置IGN/也就是默认回收子进程了
    signal(SIGPIPE, SIG_IGN);//服务端变成守护进程是不允许退出的；但是如果写端被关闭，服务端还在写默认发送这个信号是直接杀死服务端；因此对它设置成忽略
       // 2·非组长进程id的子进程成为独立会话的组长：
    pid_t pt = fork();
    if (pt > 0)
        exit(0);
        setsid();
    // 3·更改工作目录（相当于在根目录运行（某一会话的后台进程组））： 
    //为什么是是根目录：1·大多数默认规定 2·放在根目录里可以在守护进程中的代码中直接通过相对位置访问系统配置文件和资源方便 3·避免与其他进程产生资源冲突等方便管理
    if (dir == 0)
        chdir("/");
    //4·文件重定向：
    if (cle == 0)
    {
        int fd = ::open(path.c_str(), O_RDWR);
        if (fd < 0)
        {
            use_log(loglevel::FATAL) << "open " << path << " errno";
            exit(OPEN_ERR);
        }
        dup2(fd, 0);
        dup2(fd, 1);
        dup2(fd, 2);
        close(fd);
    }
}